package cn.dulian.blob;

import cn.dulian.util.JDBCUtils;
import org.junit.Test;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 使用PreparedStatement实现批量数据的操作
 * update、delete本身就具有批量操作的效果
 * 此时的批量操作，主要指的是批量插入。使用PreparedStatement如果实现更高效的批量插入？
 *
 * 题目：向goods表中插入20000条数据
 * @author dulian
 * @create 2022-04-05 11:11
 */
public class InsertTest {
    //批量插入的方式四：设置连接不允许自动提交数据
    @Test
    public void testInsert3(){
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            //设置不允许自动提交数据
            conn.setAutoCommit(false);

            String sql ="insert into goods(name) values(?)";
            ps=conn.prepareStatement(sql);
            for (int i = 0; i < 1000000; i++) {
                ps.setObject(1,"name_"+i);

                //1."攒"sql
                ps.addBatch();

                if(i%500 ==0){
                    //2.执行batch
                    ps.executeBatch();

                    //3.清空batch
                    ps.clearBatch();
                }

            }
            //提交数据
            conn.commit();
            long end = System.currentTimeMillis();
            System.out.println("花费的时间："+(end-start));//7584
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(conn,ps);
        }
    }
}
